package com.caocaog.market.finance.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.caocaog.market.constant.MarketConstant;
import com.caocaog.market.finance.entity.MkBillBase;
import com.caocaog.market.finance.entity.MkBillHistory;
import com.caocaog.market.finance.mapper.MkBillBaseMapper;
import com.caocaog.market.finance.mapper.MkBillHistoryMapper;
import com.caocaog.market.finance.service.MkBillBaseService;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.DateUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author liguang
 * @version 1.0.0
 * @Project jeecg-boot
 * @Package com.caocaog.market.finance.service.impl
 * @ClassName MkBillBaseServiceImpl.java
 * @createTime 2021年12月03日 19:25:00
 * @Description TODO
 */
@Service("mkBillBaseService")
public class MkBillBaseServiceImpl extends ServiceImpl<MkBillBaseMapper, MkBillBase> implements MkBillBaseService {
    @Autowired
    private MkBillBaseMapper billBaseMapper;
    @Autowired
    private MkBillHistoryMapper billHistoryMapper;

    /**
     * 根据条件信息查询账单信息
     *      分页查询
     */
    @Override
    public IPage<MkBillBase> findForPage(Page<MkBillBase> page, MkBillBase billBase) {

        return billBaseMapper.findForPage(page,billBase);
    }

    /**
     * 根据条件信息查询账单信息
     *      不分页查询
     */
    @Override
    public List<MkBillBase> findAllForNoPage(MkBillBase billBase) {
        return billBaseMapper.findForPage(billBase);
    }

    @Override
    public MkBillBase findBillIsExist(String orderNo) {
        return billBaseMapper.selectOne(new QueryWrapper<MkBillBase>().eq("order_no",orderNo));
    }

    /**
     * 同意退款———— 改过之后，状态为”待退款“
     * @param orderNo is not null
     * @return
     */
    @Override
    public int agreeRefund(String orderNo) {
        /**
         * 整体思路：
         *      1、先根据订单号把该记录查询出来
         *      2、再根据id修改该条记录的状态  修改为”待退款“
         *      3、状态修改成功之后，向历史mk_bill_history表中插入一条记录
         */
        //  修改为”待退款“
        return updatePayStatusAndInsertHistory(orderNo,MarketConstant.FINANCE_PAY_STATUS_DTK);
    }
    /**
     * 退款成功———— 改过之后，状态为”已退款“
     */
    @Override
    public int refundSuccess(String orderNo) {
        /**
         * 整体思路：
         *      1、先根据订单号把该记录查询出来
         *      2、再根据id修改该条记录的状态  修改为”已退款“
         *      3、状态修改成功之后，向历史mk_bill_history表中插入一条记录
         */
        // 状态修改为”已退款“
        return updatePayStatusAndInsertHistory(orderNo,MarketConstant.FINANCE_PAY_STATUS_YTK);
    }

    /**
     * 退款失败 ———— 改过之后，状态为”待结算“
     *      财务向退款客户打款时出现转账失败的情况下视为”退款失败“
     */
    @Override
    public int refundFail(String orderNo) {
        /**
         * 整体思路：
         *      1、先根据订单号把该记录查询出来
         *      2、再根据id修改该条记录的状态  修改为”待结算“
         *      3、状态修改成功之后，向历史mk_bill_history表中插入一条记录
         */
        // 状态修改为”已退款“
        return updatePayStatusAndInsertHistory(orderNo,MarketConstant.FINANCE_PAY_STATUS_DJS);
    }

    /**
     * 结算成功———— 改过之后，状态为”已结算“
     */
    @Override
    public int settledSuccess(String orderNo) {
        /**
         * 整体思路：
         *      1、先根据订单号把该记录查询出来
         *      2、再根据id修改该条记录的状态  修改为”已结算“
         *      3、状态修改成功之后，向历史mk_bill_history表中插入一条记录
         */
        // 状态修改为”已结算“
        int num = updatePayStatusAndInsertHistory(orderNo,MarketConstant.FINANCE_PAY_STATUS_YJS);
        return num;
    }

    /**
     * 具体执行修改mk_bill_base表中的状态、修改完成之后向mk_bill_history表中插入一条记录
     * @param orderNo  订单号
     *        payStatus 具体的结算状态
     * @return
     */
    /*@Transactional(rollbackOn = SystemException.class)*/
    @Override
    public int updatePayStatusAndInsertHistory(String orderNo,int payStatus){
        Date date = DateUtils.getDate();
        LoginUser currentUser = null ;
        try{
            currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        }catch (Exception e ){
            currentUser = null;
        }
        QueryWrapper<MkBillBase> billBaseQueryWrapper = new QueryWrapper<>();
        billBaseQueryWrapper.eq("order_no",orderNo);
        /**
         * 1、先根据订单号把该记录查询出来
         */
        MkBillBase billBase = billBaseMapper.selectOne(billBaseQueryWrapper);
        if (billBase == null) return 0;

        /**
         * 2、再根据id修改该条记录的状态
         */
        billBase.setPayStatus(payStatus);
        billBase.setUpdateBy((null==currentUser || currentUser.getUserType()>1) ? "admin" : currentUser.getUsername());
        billBase.setUpdateTime(date);
        if (1==payStatus){
            //待结算
            billBase.setPayStatusChangeReason(MarketConstant.FINANCE_PAY_STATUS_CHANGE_REASON_FORCE_COMPLETION);
        }
        if (2==payStatus){
            //结算完成
            billBase.setPayStatusChangeReason(MarketConstant.FINANCE_PAY_STATUS_CHANGE_REASON_JSWC);
        }
        if (3==payStatus){
            //待审核
            billBase.setPayStatusChangeReason(MarketConstant.FINANCE_PAY_STATUS_CHANGE_REASON_DSJSH);
        }
        if (4==payStatus){
            //退款成功
            billBase.setPayStatusChangeReason(MarketConstant.FINANCE_PAY_STATUS_CHANGE_REASON_TKCG);
        }
        int num = billBaseMapper.updateById(billBase);
        if(num<1){
            return 0;
        }
        /**
         * 3、状态修改成功之后，向历史mk_bill_history表中插入一条记录
         */
        billBase = billBaseMapper.selectById(billBase.getId());
        MkBillHistory billHistory = new MkBillHistory();
        BeanUtils.copyProperties(billBase,billHistory);
        billHistory.setCreateTime(date);
        billHistory.setCreateBy((null==currentUser || currentUser.getUserType()>1) ? "admin" : currentUser.getUsername());
        billHistory.setUpdateBy(null);
        billHistory.setUpdateTime(null);
        billHistory.setBillBaseId(billBase.getId());
        billHistory.setId(IdWorker.getIdStr(billHistory));
        billHistoryMapper.insert(billHistory);
        return num;
    }
}
